package com.qn.util;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTException;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import com.qn.dto.UserTokenDTO;

import java.util.HashMap;
import java.util.Map;

/**
 * jwt工具
 *
 * @author QN
 * @date 2022/05/12
 */
public class JWTUtils {
    //私钥
    private static final String TOKEN_SECRET = "123456";

    /**
     * 生成token，自定义过期时间 毫秒
     *
     * @param userTokenDTO
     * @return
     */
    public static String generateToken(UserTokenDTO userTokenDTO) {
        // 私钥和加密算法
        JWTSigner signer = JWTSignerUtil.hs256(TOKEN_SECRET.getBytes());

        // 设置头部信息
        Map<String, Object> header = new HashMap<>(2);
        header.put("Type", "Jwt");
        header.put("alg", "HS256");

        // 设置载体
        Map<String, Object> payload = new HashMap<>(3);
        payload.put("uid", userTokenDTO.getUid());
        payload.put("phone", userTokenDTO.getPhone());
        payload.put("ip", userTokenDTO.getIp());

        return JWTUtil.createToken(header, payload, signer);
    }

    /**
     * 检验token是否正确
     *
     * @param token
     * @return
     */
    public static UserTokenDTO parseToken(String token) {
        // 私钥和加密算法
        JWTSigner signer = JWTSignerUtil.hs256(TOKEN_SECRET.getBytes());
        // 校验 token
        boolean verify = JWTUtil.verify(token, signer);
        if (!verify) {
            throw new JWTException("token verify failed!");
        }
        // 解析 token
        JWT parseToken = JWTUtil.parseToken(token);
        JSONObject payloads = parseToken.getPayloads();
        return JSONUtil.toBean(payloads, UserTokenDTO.class);
    }
}
